﻿/*****************************************************************//**
 * @file    OperGraphPreprocess.h
 * @brief   前处理可视化事件操作器。
 *  
 * @author  ChengHaotian (yeguangbaozi@foxmail.com)
 * @date    2024-06-12
 *********************************************************************/

#ifndef _OPERGRAPHPREPROCESS_H__
#define _OPERGRAPHPREPROCESS_H__

#include "OperGraphEvent3D.h"

#include "FITK_Kernel/FITKCore/FITKOperatorRepo.h"

namespace GUIOper
{
    /**
     * @brief   前处理可视化事件处理。
     * @author  ChengHaotian (yeguangbaozi@foxmail.com)
     * @date    2024-06-12
     */
    class OperGraphPreprocess : public OperGraphEvent3D
    {
        Q_OBJECT

    public:
        /**
         * @brief   构造函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        explicit OperGraphPreprocess() = default;

        /**
         * @brief   析构函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        ~OperGraphPreprocess() = default;

        // 刷新数据接口。
        //@{
        /**
         * @brief   刷新全部类型可视化对象。（没有则创建）[重写]
         * @param   forceUpdate：是否强制刷新[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void updateAll(bool forceUpdate = false) override;
        /**
         * @brief    刷新全部可视化对象的可见性【没有不会创建】
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-02-11
         */
        void updateAllVisibility() override;
        /**
         * @brief   根据提供的数据对象ID更新对应可视化对象。（没有则创建）[重写]
         *          （暂不支持通过该接口刷新SEA节点可视化对象。）
         * @param   dataObjId：数据对象ID
         * @param   forceUpdate：是否强制刷新[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        void updateGraph(int dataObjId, bool forceUpdate = false) override;

        /**
         * @brief   刷新所有几何与FE模型网格部件。[重写]
         * @param   autoCreate：自动创建不存在的可视化对象[缺省]
         * @param   forceUpdate：是否强制刷新[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-29
         */
        void updateGeoAndMesh(bool autoCreate = true, bool forceUpdate = false) override;

        /**
         * @brief   刷新所有几何可见性。[重写]
         * @param   autoCreate：自动创建不存在的可视化对象[缺省]
         * @param   forceUpdate：是否强制刷新[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-05
         */
        void updateGeometrys(bool autoCreate = true, bool forceUpdate = false) override;

        /**
         * @brief   刷新所有FE模型网格部件可见性。[重写]
         * @param   autoCreate：自动创建不存在的可视化对象[缺省]
         * @param   forceUpdate：是否强制刷新[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-05
         */
        void updateMeshes(bool autoCreate = true, bool forceUpdate = false) override;

        /**
         * @brief   刷新SEA节点可见性。（自动创建可视化对象）[重写]
         * @param   forceUpdate：是否强制刷新（重新创建节点可视化对象）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-29
         */
        void updateDiscNodes(bool forceUpdate = false) override;

        /**
         * @brief   刷新SEA自由边。（强制刷新，自动创建可视化对象）[重写]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void updateSEAFreeEdges() override;

        /**
         * @brief   刷新全部SEA子系统对象。（自动创建可视化对象）[重写]
         * @param   forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-04
         */
        void updateSEASubSystems(bool forceUpdate = false) override;
        /**
         * @brief   刷新全部指定的SEA子系统对象。（不自动创建可视化对象）[重写]
         * @param   subSysTypeEnum：SEA子系统类型枚举值
         * @param   forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-25
         */
        void updateSEASubSystem(int subSysTypeEnum, bool forceUpdate = false) override;
        /**
         * @brief    刷新全部FE面对象。（自动创建可视化对象）[虚函数]
         * @param[i] forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        void updateFEFaces(bool forceUpdate = false) override;
        /**
         * @brief    更新全部连接对象（自动创建可视化对象）[虚函数]
         * @param[i] forceUpdate                    是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-02-10
         */
        void updateJunctions(bool forceUpdate = false) override;
        /**
         * @brief    刷新全部FE子系统对象。（自动创建可视化对象）[虚函数]
         * @param[i] forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        void updateFESubSystems(bool forceUpdate = false) override;
        /**
         * @brief   刷新全部载荷对象。（自动创建可视化对象）[重写]
         * @param   forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        void updateLoads(bool forceUpdate = false) override;
        /**
         * @brief   刷新全部传感器对象。（自动创建可视化对象）[虚函数]
         * @param   forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        void updateSensors(bool forceUpdate = false) override;
        //@}

        // 切换显示/隐藏接口。
        //@{
        /**
         * @brief   显示或隐藏几何与网格。（不自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void setCADVisiblity(bool visibility) override;

        /**
         * @brief   显示或隐藏几何。（不自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void setGeometrysVisiblity(bool visibility) override;

        /**
         * @brief   显示或隐藏几何点。（不自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        void setGeoPointsVisiblity(bool visibility) override;

        /**
         * @brief   显示或隐藏几何线。（不自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        void setGeoEdgesVisiblity(bool visibility) override;

        /**
         * @brief   显示或隐藏几何面。（不自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        void setGeoFacesVisiblity(bool visibility) override;

        /**
         * @brief   显示或隐藏几何体。（不自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        void setGeoSolidsVisiblity(bool visibility) override;

        /**
         * @brief   显示或隐藏网格。（不自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void setMeshesVisiblity(bool visibility) override;

        /**
         * @brief   刷新已用SEA节点可见性。（自动创建可视化对象）[重写]
         * @param   visibleObjects：是否显示可见对象上的SEA节点
         * @param   unused：是否显示未被用到的SEA节点
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void setUsedDiscNodesVisibility(bool visibility) override;

        /**
         * @brief   刷新未用SEA节点可见性。（自动创建可视化对象）[重写]
         * @param   visibleObjects：是否显示可见对象上的SEA节点
         * @param   unused：是否显示未被用到的SEA节点
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void setUnusedDiscNodesVisibility(bool visibility) override;

        /**
         * @brief    设置点标签的可见性
         * @param[i] visibility                          可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-02-21
         */
        void setNodeLabelsVisibility(bool visibility) override;

        /**
         * @brief   刷新SEA节点可见性。（自动创建可视化对象）[重写]
         * @param   visibleObjects：是否显示可见对象上的SEA节点
         * @param   unused：是否显示未被用到的SEA节点
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void setDiscNodesVisibility(bool visibleObjects, bool unused) override;

        /**
         * @brief   刷新SEA自由边对象可见性。（重新计算，自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void setSEAFreeEdgesVisibility(bool visibility) override;

        /**
         * @brief   刷新全部类型子系统对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void setSubSystemsVisibility(bool visibility) override;

        /**
         * @brief   刷新全部类型的SEA子系统对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void setSEASubSystemsVisibility(bool visibility) override;
        /**
         * @brief    刷新SEA全部子系统板对象的可见性。（自动创建可视化对象）[重写]
         * @param[i] visibility                          可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-18
         */
        void setSEASubSystemShellsVisibility(bool visibility) override;
        /**
         * @brief   刷新全部指定类型的SEA子系统对象可见性。（自动创建可视化对象）[重写]
         * @param   subSysTypeEnum：SEA子系统类型枚举值
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        void setSEASubSystemsVisibility(int subSysTypeEnum, bool visibility) override;

        /**
         * @brief    刷新FE类型子系统对象可见性。（自动创建可视化对象）[虚函数]
         * @param    visibility：可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        void setFESubSystemsVisibility(bool visibility) override;

        /**
         * @brief    刷新全部FE面显示。（自动创建可视化对象）[虚函数]
         * @param    visibility：可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        void setFEFaceVisibility(bool visibility) override;
        /**
         * @brief    刷新全部FE结构显示。（自动创建可视化对象）[虚函数]
         * @param[i] visibility                    可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-02
         */
        void setFEStructVisibility(bool visibility) override;
        /**
         * @brief    刷新全部FE声腔显示。（自动创建可视化对象）[虚函数]
         * @param[i] visibility                    可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-02
         */
        void setFEAcousticsVisibility(bool visibility) override;

        /**
         * @brief   刷新全部连接关系对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        void setJunctionsVisibility(bool visibility) override;

        /**
         * @brief   刷新全部连接点对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        void setJunctionPointsVisibility(bool visibility) override;

        /**
         * @brief   刷新全部连接线对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        void setJunctionLinesVisibility(bool visibility) override;

        /**
         * @brief   刷新全部连接区域对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        void setJunctionAreasVisibility(bool visibility) override;

        /**
         * @brief   刷新全部SEA连接点对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        void setSEAJunctionPointsVisibility(bool visibility) override;

        /**
         * @brief   刷新全部SEA连接线对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        void setSEAJunctionLinesVisibility(bool visibility) override;

        /**
         * @brief   刷新全部SEA连接区域对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-15
         */
        void setSEAJunctionAreasVisibility(bool visibility) override;

        /**
         * @brief   刷新全部载荷对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        void setLoadsVisibility(bool visibility) override;

        /**
         * @brief   刷新全部力矩载荷对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        void setLoadsPointForceVisibility(bool visibility) override;

        /**
         * @brief   刷新全部功率载荷对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        void setLoadsPowerVisibility(bool visibility) override;

        /**
         * @brief   刷新全部约束载荷对象可见性。（自动创建可视化对象）[重写]
         * @param   visibility：可见性
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        void setLoadsConstraintVisibility(bool visibility) override;
        /**
         * @brief    刷新全部HVAC噪声载荷对象可见性（自动创建可视化对象）[重写]
         * @param[i] visibility                      可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-15
         */
        void setLoadsHVACNoiseVisibility(bool visibility) override;
        /**
         * @brief    刷新全部单极子载荷对象可见性（自动创建可视化对象）[重写]
         * @param[i] visibility                      可见性
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-15
         */
        void setLoadsMonopoleVisibility(bool visibility) override;
        /**
         * @brief   刷新全部传感器对象。（自动创建可视化对象）[虚函数]
         * @param   forceUpdate：是否强制刷新（重新创建可视化对象，数据未发生变化时不建议设置为true）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        void setSensorVisibility(bool visibility) override;
        //@}

        // 附加高级功能。
        //@{
        /**
         * @brief   是否开启子系统缩放模式。（爆炸效果）[重写]
         * @param   isOn：是否开启
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-11
         */
        void setEnableSubSystemScale(bool isOn) override;
        //@}
        /**
         * @brief    高亮
         * @param[i] objID               高亮数据对象ID
         * @param[i] forceUpdate         是否强制刷新
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-16
         */
        void hightGraphObj(int objID, bool forceUpdate = false) override;
        /**
         * @brief    取消高亮
         * @param[i] objID             取消高亮数据对象
         * @param[i] forceUpdate       是否强制刷新
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-16
         */
        void disHightGraphObj(int objID, bool forceUpdate = false) override;
        /**
         * @brief    清除所有与高亮
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-16
         */
        void clearAllHightGraph()override;
        // 渲染专用接口。
        //@{

        /**
         * @brief   根据相机视角变化刷新可视化对象（相机操作自动调用，无需外部手动调用）。[重写]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-06
         */
        void updateWithCameraChanged() override;
        /**
         * @brief    根据提供的数据对象ID递归更新对应可视化对象。（没有则不创建）
         * @param    dataObjId：数据对象ID
         * @param    refLayer：更新引用数据的层级（-1则递归至根数据）[缺省]
         * @param    recDown：向下递归（被引用方向查询）[缺省]
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-14
         */
        void updateGraphRecursively(int dataObjId, int refLayer = 2, bool recDown = true) override;
        //@}

    private:
        /**
         * @brief   刷新全部SEA子系统可视化对象可见性。（不自动创建可视化对象）
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-19
         */
        void updateSEASubSystemsVisibility();
        /**
         * @brief    刷新全部SEA板可视化对象可见性。（不自动创建可视化对象）
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-18
         */
        void updateSEASubSystemShellsVisibility();

        /**
         * @brief   刷新全部FE子系统可视化对象可见性。（不自动创建可视化对象）
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        void updateFESubSystemsVisibility();
        /**
         * @brief   刷新全部FE面可视化对象可见性。（不自动创建可视化对象）
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        void updateFEFacesVisibility();
        /**
         * @brief   刷新全部传感器可视化对象可见性。（不自动创建可视化对象）
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-31
         */
        void updateSensorsVisibility();
        /**
         * @brief   刷新全部载荷可视化对象可见性。（不自动创建可视化对象）
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        void updateLoadsVisibility();

    };

    Register2FITKOperatorRepo(GraphPreprocess, OperGraphPreprocess);

}  // namespace GUIOper

#endif
